package org.finesys.common.core.util;

import cn.hutool.core.util.ObjectUtil;

import java.math.BigDecimal;

public class ConvertUtil {

    /**
     * 转换为字符串<br>
     * 如果给定的值为null，或者转换失败，返回默认值<br>
     * 转换失败不会报错
     *
     * @param obj          被转换的值
     * @param defaultValue 转换错误时的默认值
     * @return 结果
     */
    public static String toStr(Object obj, String defaultValue) {
        if (obj == null) {
            return defaultValue;
        }
        if (obj instanceof String) {
            return (String) obj;
        }
        return obj.toString();
    }

    /**
     * 转换为long<br>
     * 如果给定的值为空，或者转换失败，返回默认值<br>
     * 转换失败不会报错
     *
     * @param obj          被转换的值
     * @param defaultValue 转换错误时的默认值
     * @return 结果
     */
    public static Long toLong(Object obj, Long defaultValue) {
        if (obj == null) {
            return defaultValue;
        }
        if (obj instanceof Long) {
            return (Long) obj;
        }
        if (obj instanceof Number) {
            return ((Number) obj).longValue();
        }
        String valueStr = toStr(obj, null);
        if (StrUtil.isEmpty(valueStr)) {
            return defaultValue;
        }

        try {
            return new BigDecimal(valueStr.trim()).longValue();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return defaultValue;
    }

    /**
     * 转换为Long数组<br>
     *
     * @param str 被转换的值
     * @return 结果
     */
    public static Long[] toLongArray(String str) {
        return toLongArray(",", str);
    }

    /**
     * 转换为Long数组<br>
     *
     * @param delimiter 分隔符
     * @param str       被转换的值
     * @return 结果
     */
    public static Long[] toLongArray(String delimiter, String str) {
        if (StrUtil.isEmpty(str)) {
            return new Long[]{};
        }
        String[] strArray = str.split(delimiter);
        return toLongArray(strArray);
    }

    /**
     * 转换为Long数组<br>
     *
     * @param strArray 被转换的值
     * @return 结果
     */
    public static Long[] toLongArray(String[] strArray) {
        if (ObjectUtil.isEmpty(strArray)) {
            return new Long[]{};
        }
        final Long[] longs = new Long[strArray.length];
        for (int i = 0; i < strArray.length; i++) {
            final Long v = toLong(strArray[i], null);
            longs[i] = v;
        }
        return longs;
    }


    /**
     * 转换为int<br>
     * 如果给定的值为空，或者转换失败，返回默认值<br>
     * 转换失败不会报错
     *
     * @param obj          被转换的值
     * @param defaultValue 转换错误时的默认值
     * @return 结果
     */
    public static Integer toInt(Object obj, Integer defaultValue) {
        if (obj == null) {
            return defaultValue;
        }
        if (obj instanceof Long) {
            return (Integer) obj;
        }
        if (obj instanceof Number) {
            return ((Number) obj).intValue();
        }
        String valueStr = toStr(obj, null);
        if (StrUtil.isEmpty(valueStr)) {
            return defaultValue;
        }

        try {
            return new BigDecimal(valueStr.trim()).intValue();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return defaultValue;
    }

    /**
     * 转换为Long数组<br>
     *
     * @param str 被转换的值
     * @return 结果
     */
    public static Integer[] toIntArray(String str) {
        return toIntArray(",", str);
    }

    /**
     * 转换为Integer数组<br>
     *
     * @param delimiter 分隔符
     * @param str       被转换的值
     * @return 结果
     */
    public static Integer[] toIntArray(String delimiter, String str) {
        if (StrUtil.isEmpty(str)) {
            return new Integer[]{};
        }
        String[] strArray = str.split(delimiter);
        final Integer[] longs = new Integer[strArray.length];
        for (int i = 0; i < strArray.length; i++) {
            final Integer v = toInt(strArray[i], null);
            longs[i] = v;
        }
        return longs;
    }


}
